From b43e6dd2d6d9965cae17698b40201ca4b5143b06 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Juan=20Hern=C3=A1ndez?= Date: Fri, 30 Sep 2016 13:27:10 +0200 Subject: [PATCH] Show an error messager for invalid semver spec for packages in the [replace] section. The [replace] section in the Cargo.toml file doesn't allow invalid semver specs for packages, so something like this: [dependencies] foo = "*" [replace] "foo:*" = { git = 'https://example.com' } It's not valid. In this case we will display an error message like this: error: failed to parse manifest at `Cargo.toml` Caused by: replacements must specify a valid semver version to replace, but `foo:*` does not --- src/cargo/core/package_id_spec.rs | 1 + src/cargo/util/toml.rs | 7 ++++++- tests/overrides.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/cargo/core/package_id_spec.rs b/src/cargo/core/package_id_spec.rs index 031249393..3299ada57 100644 --- a/src/cargo/core/package_id_spec.rs +++ b/src/cargo/core/package_id_spec.rs @@ -257,6 +257,7 @@ mod tests { #[test] fn bad_parsing() { assert!(PackageIdSpec::parse("baz:").is_err()); + assert!(PackageIdSpec::parse("baz:*").is_err()); assert!(PackageIdSpec::parse("baz:1.0").is_err()); assert!(PackageIdSpec::parse("http://baz:1.0").is_err()); assert!(PackageIdSpec::parse("http://#baz:1.0").is_err()); diff --git a/src/cargo/util/toml.rs b/src/cargo/util/toml.rs index ac94d3a28..578d44743 100644 --- a/src/cargo/util/toml.rs +++ b/src/cargo/util/toml.rs @@ -737,7 +737,12 @@ impl TomlManifest { -> CargoResult> { let mut replace = Vec::new(); for (spec, replacement) in self.replace.iter().flat_map(|x| x) { - let spec = try!(PackageIdSpec::parse(spec)); + let spec = match PackageIdSpec::parse(spec) { + Ok(spec) => spec, + Err(_) => bail!("replacements must specify a \ + valid semver version \ + to replace, but `{}` does not", spec), + }; let version_specified = match *replacement { TomlDependency::Detailed(ref d) => d.version.is_some(), diff --git a/tests/overrides.rs b/tests/overrides.rs index 5eebed0bf..eff9bbf9d 100644 --- a/tests/overrides.rs +++ b/tests/overrides.rs @@ -77,6 +77,32 @@ Caused by: ")); } +#[test] +fn invalid_semver_version() { + let p = project("local") + .file("Cargo.toml", r#" + [package] + name = "local" + version = "0.0.1" + authors = [] + + [dependencies] + foo = "*" + + [replace] + "foo:*" = { git = 'https://example.com' } + "#) + .file("src/lib.rs", ""); + + assert_that(p.cargo_process("build"), + execs().with_status(101).with_stderr("\ +error: failed to parse manifest at `[..]` + +Caused by: + replacements must specify a valid semver version to replace, but `foo:*` does not +")); +} + #[test] fn different_version() { Package::new("foo", "0.2.0").publish(); -- 2.30.2